home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Mac Game Programming Gurus / TricksOfTheMacGameProgrammingGurus.iso / More Source / C⁄C++ / Kant Generator Pro 1.2 / src / kode ƒ / kant search.c < prev    next >
C/C++ Source or Header  |  1995-01-31  |  6KB  |  258 lines

  1. #include "kant search.h"
  2. #include "text twiddling.h"
  3. #include "dialogs.h"
  4. #include "util.h"
  5. #include "prefs.h"
  6. #include "main.h"
  7. #include "window layer.h"
  8. #include "program globals.h"
  9.  
  10. extern    Boolean            gCustomCursor;    /* see environment.c */
  11.  
  12. #define findDialog    500
  13.  
  14. Boolean            gStartFromTop;
  15. Boolean            gIgnoreCase;
  16. Str255            gFindString;
  17. Str255            gReplaceString;
  18. short            gLastFindPosition;
  19.  
  20. static    Boolean SearchDoneQQ(short strPos, short strLen);
  21.  
  22. void SetLastFindPosition(short val)
  23. {
  24.     gLastFindPosition=val;
  25. }
  26.  
  27. short SearchForwards(TEHandle hTE, short *foundLength)
  28. {
  29.     short            offset;
  30.     short            max;
  31.     short            strPos;
  32.     short            strLen;
  33.     unsigned char    *a;
  34.     unsigned char    theChar, matchChar;
  35.     
  36.     max=(**hTE).teLength;
  37.     HLock((**hTE).hText);
  38.     a=(unsigned char*)(*((**hTE).hText));
  39.     strPos=1;
  40.     strLen=gFindString[0];
  41.     
  42.     offset=gLastFindPosition;
  43.     while ((offset<max) && (!SearchDoneQQ(strPos, strLen)))
  44.     {
  45.         if (gIgnoreCase)
  46.         {
  47.             theChar=a[offset];
  48.             if ((theChar>='A') && (theChar<='Z'))
  49.                 theChar|=0x20;
  50.             matchChar=gFindString[strPos];
  51.             if ((matchChar>='A') && (matchChar<='Z'))
  52.                 matchChar|=0x20;
  53.             if (theChar==matchChar)
  54.                 strPos++;
  55.             else
  56.                 strPos=1;
  57.         }
  58.         else
  59.         {
  60.             if (a[offset]==gFindString[strPos])
  61.                 strPos++;
  62.             else
  63.                 strPos=1;
  64.         }
  65.         offset++;
  66.     }
  67.     
  68.     HUnlock((**hTE).hText);
  69.     if ((strLen>0) && (strPos>strLen))
  70.     {
  71.         SetLastFindPosition(offset+1);
  72.         *foundLength=strLen;
  73.         return offset-strLen;
  74.     }
  75.     
  76.     return -1;
  77. }
  78.  
  79. Boolean SearchDoneQQ(short strPos, short strLen)
  80. {
  81.     Boolean            done;
  82.     
  83.     done=FALSE;
  84.     if (gFindString[0]!=0x00)
  85.         done=(strPos>strLen);
  86.     
  87.     return done;
  88. }
  89.  
  90. Boolean DoFindDialog(void)
  91. {
  92.     DialogPtr        theDlog;
  93.     short            itemSelected;
  94.     Handle            itemH;
  95.     short            itemType;
  96.     Rect            box;
  97.     ModalFilterUPP    procFilter = NewModalFilterProc(TwoButtonFilter);
  98.     UserItemUPP        userUPP=NewUserItemProc(OutlineDefaultButton);
  99.     Boolean            ignoreCase, startFromTop;
  100.     Boolean            found;
  101.     
  102.     SetCursor(&qd.arrow);
  103.     gCustomCursor=FALSE;
  104.     
  105.     PositionDialog('DLOG', findDialog);
  106.     theDlog = GetNewDialog(findDialog, 0L, (WindowPtr)-1L);
  107.  
  108.     GetDItem(theDlog, 3, &itemType, &itemH, &box);
  109.     InsetRect(&box, -4, -4);
  110.     SetDItem(theDlog, 3, itemType, (Handle)userUPP, &box);
  111.     
  112.     ignoreCase=gIgnoreCase;
  113.     startFromTop=gStartFromTop;
  114.     
  115.     GetDItem(theDlog, 7, &itemType, &itemH, &box);
  116.     SetIText(itemH, gFindString);
  117.     SelIText(theDlog, 7, 0, 32767);
  118.     GetDItem(theDlog, 8, &itemType, &itemH, &box);
  119.     SetIText(itemH, gReplaceString);
  120.     GetDItem(theDlog, 9, &itemType, &itemH, &box);
  121.     SetControlValue((ControlHandle)itemH, ignoreCase ? 1 : 0);
  122.     GetDItem(theDlog, 10, &itemType, &itemH, &box);
  123.     SetControlValue((ControlHandle)itemH, startFromTop ? 1 : 0);
  124.     
  125.     SetWTitle((WindowPtr)theDlog, "\pFind");
  126.     ShowWindow(theDlog);
  127.     itemSelected=0;
  128.     while ((itemSelected!=1) && (itemSelected!=2) && (itemSelected!=4))
  129.     {
  130.         ModalDialog(procFilter, &itemSelected);
  131.         
  132.         switch (itemSelected)
  133.         {
  134.             case 9:    /* ignore case checkbox */
  135.                 ignoreCase=!ignoreCase;
  136.                 GetDItem(theDlog, 9, &itemType, &itemH, &box);
  137.                 SetControlValue((ControlHandle)itemH, ignoreCase ? 1 : 0);
  138.                 break;
  139.             case 10:    /* start from top checkbox */
  140.                 startFromTop=!startFromTop;
  141.                 GetDItem(theDlog, 10, &itemType, &itemH, &box);
  142.                 SetControlValue((ControlHandle)itemH, startFromTop ? 1 : 0);
  143.                 break;
  144.         }
  145.     }
  146.     
  147.     if (itemSelected!=2)
  148.     {
  149.         GetDItem(theDlog, 7, &itemType, &itemH, &box);
  150.         GetIText(itemH, gFindString);
  151.         GetDItem(theDlog, 8, &itemType, &itemH, &box);
  152.         GetIText(itemH, gReplaceString);
  153.         GetDItem(theDlog, 9, &itemType, &itemH, &box);
  154.         gIgnoreCase=(GetControlValue((ControlHandle)itemH)==0x00) ? FALSE : TRUE;
  155.         GetDItem(theDlog, 10, &itemType, &itemH, &box);
  156.         gStartFromTop=(GetControlValue((ControlHandle)itemH)==0x00) ? FALSE : TRUE;
  157.     }
  158.  
  159.     HideWindow(theDlog);
  160.     DisposeDialog(theDlog);
  161.     DisposeRoutineDescriptor(procFilter);
  162.     DisposeRoutineDescriptor(userUPP);
  163.     
  164.     while (HandleSingleEvent(FALSE)) {};
  165.     
  166.     if (itemSelected!=2)
  167.     {
  168.         SaveThePrefs();
  169.         if (gStartFromTop)
  170.             SetWindowLastFindPosition(GetFrontDocumentWindow(), 0);
  171.         if (itemSelected==1)
  172.         {
  173.             found=DoFindAgain();
  174.             if (!found)
  175.                 SysBeep(7);
  176.             return found;
  177.         }
  178.         else
  179.         {
  180.             DoReplaceAll();
  181.             return TRUE;
  182.         }
  183.     }
  184.     
  185.     return FALSE;
  186. }
  187.  
  188. Boolean DoFindAgain(void)
  189. {
  190.     TEHandle        hTE;
  191.     short            newOffset;
  192.     short            len;
  193.     WindowPtr        theWindow;
  194.     
  195.     if ((theWindow=GetFrontDocumentWindow())==0L)
  196.         return FALSE;
  197.     
  198.     if ((hTE=GetWindowTE(theWindow))==0L)
  199.         return FALSE;
  200.     
  201.     SetLastFindPosition(GetWindowLastFindPosition(theWindow));
  202.     newOffset=SearchForwards(hTE, &len);
  203.     if (newOffset!=-1)
  204.     {
  205.         TESetSelect(newOffset, newOffset+len, hTE);
  206.         TESelView(hTE);
  207.         AdjustVScrollBar(GetWindowVScrollBar(theWindow), hTE);
  208.         SetWindowLastFindPosition(theWindow, newOffset+len);
  209.         return TRUE;
  210.     }
  211.     
  212.     return FALSE;
  213. }
  214.  
  215. void DoReplace(void)
  216. {
  217.     WindowPtr        theWindow;
  218.     TEHandle        hTE;
  219.     
  220.     if ((theWindow=GetFrontDocumentWindow())==0L)
  221.         return;
  222.     if ((hTE=GetWindowTE(theWindow))==0L)
  223.         return;
  224.     
  225.     TEDelete(hTE);
  226.     InsertBeforeStart(theWindow, gReplaceString);
  227.     AdjustVScrollBar(GetWindowVScrollBar(theWindow), hTE);
  228.     SetWindowLastFindPosition(theWindow, (**hTE).selEnd);
  229. }
  230.  
  231. void DoReplaceAll(void)
  232. {
  233.     SetWindowLastFindPosition(GetFrontDocumentWindow(), 0);
  234.     while (DoFindAgain())
  235.         DoReplace();
  236.     SysBeep(7);
  237. // maybe show alert here saying how many were found?
  238. }
  239.  
  240. void DoEnterString(Boolean isFindString)
  241. {
  242.     WindowPtr        theWindow;
  243.     
  244.     if ((theWindow=GetFrontDocumentWindow())==0L)
  245.         return;
  246.     GetSelectionString(theWindow, isFindString ? gFindString : gReplaceString);
  247. }
  248.  
  249. Boolean AnythingToFindQQ(void)
  250. {
  251.     return (gFindString[0]!=0x00);
  252. }
  253.  
  254. Boolean AnythingToReplaceQQ(void)
  255. {
  256.     return (gReplaceString[0]!=0x00);
  257. }
  258.